home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 September / PCWorld_2008-09_cd.bin / v cisle / sadanastroju / delicious_bookmarks-2.0.64-fx.xpi / components / ybAutoComplete.js < prev   
Text File  |  2008-06-19  |  7KB  |  221 lines

  1. const Ci = Components.interfaces;
  2.  
  3. const CLASS_ID = Components.ID("6224daa1-71a2-4d1a-ad90-01ca1c08e323");
  4. const CLASS_NAME = "YBookmarks AutoComplete";
  5. const CONTRACT_ID = "@mozilla.org/autocomplete/search;1?name=ybookmarks-autocomplete";
  6.  
  7.  
  8. // Load yDebug.js
  9. ( ( Components.classes["@mozilla.org/moz/jssubscript-loader;1"] ).getService( 
  10.      Ci.mozIJSSubScriptLoader ) ).loadSubScript( 
  11.         "chrome://ybookmarks/content/yDebug.js" ); 
  12.  
  13. ( ( Components.classes["@mozilla.org/moz/jssubscript-loader;1"] ).getService( 
  14.      Ci.mozIJSSubScriptLoader ) ).loadSubScript( 
  15.         "chrome://ybookmarks/content/ybookmarksUtils.js" ); 
  16.         
  17. // Implements nsIAutoCompleteResult
  18. function ybAutoCompleteResult(searchString, searchResult,
  19.                                   defaultIndex, errorDescription,
  20.                                   results, comments) {
  21.   this._searchString = searchString;
  22.   this._searchResult = searchResult;
  23.   this._defaultIndex = defaultIndex;
  24.   this._errorDescription = errorDescription;
  25.   this._results = results;
  26.   this._comments = comments;
  27. }
  28.  
  29. ybAutoCompleteResult.prototype = {
  30.   _searchString: "",
  31.   _searchResult: 0,
  32.   _defaultIndex: 0,
  33.   _errorDescription: "",
  34.   _results: [],
  35.   _comments: [],
  36.  
  37.   /**
  38.    * The original search string
  39.    */
  40.   get searchString() {
  41.     return this._searchString;
  42.   },
  43.  
  44.   /**
  45.    * The result code of this result object, either:
  46.    *         RESULT_IGNORED   (invalid searchString)
  47.    *         RESULT_FAILURE   (failure)
  48.    *         RESULT_NOMATCH   (no matches found)
  49.    *         RESULT_SUCCESS   (matches found)
  50.    */
  51.   get searchResult() {
  52.     return this._searchResult;
  53.   },
  54.  
  55.   /**
  56.    * Index of the default item that should be entered if none is selected
  57.    */
  58.   get defaultIndex() {
  59.     return this._defaultIndex;
  60.   },
  61.  
  62.   /**
  63.    * A string describing the cause of a search failure
  64.    */
  65.   get errorDescription() {
  66.     return this._errorDescription;
  67.   },
  68.  
  69.   /**
  70.    * The number of matches
  71.    */
  72.   get matchCount() {
  73.     return this._results.length;
  74.   },
  75.  
  76.   /**
  77.    * Get the value of the result at the given index
  78.    */
  79.   getValueAt: function(index) {
  80.     return this._results[index];
  81.   },
  82.  
  83.   /**
  84.    * Get the comment of the result at the given index
  85.    */
  86.   getCommentAt: function(index) {
  87.       return this._comments[index];
  88.   },
  89.  
  90.   /**
  91.    * Get the style hint for the result at the given index
  92.    */
  93.   getStyleAt: function(index) {
  94. //    if (index == 0)
  95. //      return "suggestfirst";  // category label on first line of results
  96.  
  97. //    return "suggesthint";   // category label on any other line of results
  98.   },
  99.  
  100.   /**
  101.    * Remove the value at the given index from the autocomplete results.
  102.    * If removeFromDb is set to true, the value should be removed from
  103.    * persistent storage as well.
  104.    */
  105.   removeValueAt: function(index, removeFromDb) {
  106.     this._results.splice(index, 1);
  107.     this._comments.splice(index, 1);
  108.   },
  109.  
  110.   QueryInterface: function(aIID) {
  111.     if (!aIID.equals(Ci.nsIAutoCompleteResult) && !aIID.equals(Ci.nsISupports))
  112.         throw Components.results.NS_ERROR_NO_INTERFACE;
  113.     return this;
  114.   }
  115. };
  116.  
  117.  
  118. // Implements nsIAutoCompleteSearch
  119. function ybAutoCompleteSearch() {
  120. }
  121.  
  122. ybAutoCompleteSearch.prototype = {
  123.   /*
  124.    * Search for a given string and notify a listener (either synchronously
  125.    * or asynchronously) of the result
  126.    *
  127.    * @param searchString - The string to search for
  128.    * @param searchParam - An extra parameter
  129.    * @param previousResult - A previous result to use for faster searchinig
  130.    * @param listener - A listener to notify when the search is complete
  131.    */
  132.   startSearch: function(searchString, searchParam, result, listener) {
  133.       try {
  134.         var results = [];
  135.         var comments = [];
  136.           var localStore = ( Components.classes[ "@mozilla.org/ybookmarks-store-service;1" ].
  137.                                               getService( Ci.nsIYBookmarksStoreService ) );
  138.          
  139.         var suggestion, tag, count;
  140.         var inputTagArray = searchString.split(/\s */);
  141.         var keyword = inputTagArray[inputTagArray.length-1];
  142.         
  143.         var suggestions = localStore.getTagSuggestions(keyword, false);
  144.         
  145.         //add stuff in
  146.         outer: for (var i = 0; i < suggestions.length; i++) {
  147.             suggestion = suggestions.queryElementAt(i, Components.interfaces.nsIWritablePropertyBag);
  148.             tag = suggestion.getProperty("tag");
  149.             count = suggestion.getProperty("count");
  150.     
  151.             //do not show suggestion tag which is already in the tags textbox
  152.             
  153.             for (t in inputTagArray) {
  154.               if (tag == inputTagArray[t] && tag != keyword) {
  155.                 continue outer;
  156.               }
  157.             }
  158.     
  159.             results.push(tag);
  160.             comments.push(tag + " (" + count + ")");
  161.         }
  162.         
  163.         var newResult = new ybAutoCompleteResult(searchString, Ci.nsIAutoCompleteResult.RESULT_SUCCESS, 0, "", results, comments);
  164.         listener.onSearchResult(this, newResult);
  165.       } catch(e) {
  166.           yDebug.print("ybautocomplete.js: Exception: "+e, YB_LOG_MESSAGE)
  167.       }
  168.   },
  169.  
  170.   /*
  171.    * Stop an asynchronous search that is in progress
  172.    */
  173.   stopSearch: function() {
  174.   },
  175.     
  176.   QueryInterface: function(aIID) {
  177.     if (!aIID.equals(Ci.nsIAutoCompleteSearch) && !aIID.equals(Ci.nsISupports))
  178.         throw Components.results.NS_ERROR_NO_INTERFACE;
  179.     return this;
  180.   }
  181. };
  182.  
  183. // Factory
  184. var ybAutoCompleteSearchFactory = {
  185.   singleton: null,
  186.   createInstance: function (aOuter, aIID) {
  187.     if (aOuter != null)
  188.       throw Components.results.NS_ERROR_NO_AGGREGATION;
  189.     if (this.singleton == null)
  190.       this.singleton = new ybAutoCompleteSearch();
  191.     return this.singleton.QueryInterface(aIID);
  192.   }
  193. };
  194.  
  195. // Module
  196. var ybAutoCompleteSearchModule = {
  197.   registerSelf: function(aCompMgr, aFileSpec, aLocation, aType) {
  198.     aCompMgr = aCompMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
  199.     aCompMgr.registerFactoryLocation(CLASS_ID, CLASS_NAME, CONTRACT_ID, aFileSpec, aLocation, aType);
  200.   },
  201.  
  202.   unregisterSelf: function(aCompMgr, aLocation, aType) {
  203.     aCompMgr = aCompMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
  204.     aCompMgr.unregisterFactoryLocation(CLASS_ID, aLocation);        
  205.   },
  206.   
  207.   getClassObject: function(aCompMgr, aCID, aIID) {
  208.     if (!aIID.equals(Components.interfaces.nsIFactory))
  209.       throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
  210.  
  211.     if (aCID.equals(CLASS_ID))
  212.       return ybAutoCompleteSearchFactory;
  213.  
  214.     throw Components.results.NS_ERROR_NO_INTERFACE;
  215.   },
  216.  
  217.   canUnload: function(aCompMgr) { return true; }
  218. };
  219.  
  220. // Module initialization
  221. function NSGetModule(aCompMgr, aFileSpec) { return ybAutoCompleteSearchModule; }